/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wiimote;

import wiiusej.wiiusejevents.physicalevents.*;
import wiiusej.wiiusejevents.utils.WiimoteListener;
import wiiusej.wiiusejevents.wiiuseapievents.*;

import coursevoitures.Ctrl;

/**
 * Controleur de Wiimote, il permet de capturer les evenements generes par la Wiimote et de faire appel aux methode du Ctrl.
 * @author Aurelien
 */
public class Wiimote_Controleur extends Thread implements WiimoteListener {

    private Ctrl ctrl;

    private boolean enMvt = false;
    
    private boolean enMvtAvancer = false;
    private boolean enMvtReculer = false;
    private boolean enMvtTournerGauche = false;
    private boolean enMvtTournerDroite = false;

    private boolean enMvtDiagonaleHauteDroite = false;
    private boolean enMvtDiagonaleHauteGauche = false;
    private boolean enMvtDiagonaleBasDroite = false;
    private boolean enMvtDiagonaleBasGauche = false;

    /**
     * Constructeur de la classe, il stock la reference du Ctrl de l'application.
     * @param c le Ctrl de l'application.
     */
    public Wiimote_Controleur(Ctrl c){
        ctrl = c;
    }

    /**
     * Permet d'afficher un message dans la GUI
     * @param msg Le message a afficher
     */
    public void afficherMessage(String msg){
        System.out.println(msg);
        //ctrl.afficherMessage(msg);
    }

    public void run(){
        while(true);
    }

    /**
     * Acquisition des données de la Wiimote.
     * @param arg0 l'evenement genere par la Wiimote.
     */
    public void onButtonsEvent(WiimoteButtonsEvent arg0) {

        if (arg0.isButtonAJustPressed()) {
            //afficherMessage("Bouton A JustPressed");
            ctrl.bip(arg0.getWiimoteId());
            
        } else if (arg0.isButtonAJustReleased()) {
            //afficherMessage("Bouton A JustReleased");
        }
                
        else if (arg0.isButtonBJustPressed()) {
            //afficherMessage("Bouton B JustPressed");
            ctrl.stopRobot(arg0.getWiimoteId());
        } else if (arg0.isButtonBJustReleased()) {
            //afficherMessage("Bouton B JustReleased");
        }

        else if (arg0.isButtonDownJustPressed()){
            //afficherMessage("Bouton Bas JustPressed");
            ctrl.reculer(arg0.getWiimoteId());
        }else if (arg0.isButtonDownJustReleased()){
            //afficherMessage("Bouton Bas JustReleased");
            ctrl.stopRobot(arg0.getWiimoteId());
        }

        else if (arg0.isButtonUpJustPressed()){
            //afficherMessage("Bouton Haut JustPressed");            
            ctrl.avancer(arg0.getWiimoteId());
        }else if (arg0.isButtonUpJustReleased()){
            //afficherMessage("Bouton Haut JustReleased");
            ctrl.stopRobot(arg0.getWiimoteId());
        }

        else if (arg0.isButtonLeftJustPressed()){
            //afficherMessage("Bouton Gauche JustPressed");
            ctrl.tournerGauche(arg0.getWiimoteId());
        }else if (arg0.isButtonLeftJustReleased()){
            //afficherMessage("Bouton Gauche JustReleased");
            ctrl.stopRobot(arg0.getWiimoteId());
        }

        else if (arg0.isButtonRightJustPressed()){
            //afficherMessage("Bouton Droit JustPressed");
            ctrl.tournerDroite(arg0.getWiimoteId());
        }else if (arg0.isButtonRightJustReleased()){
            //afficherMessage("Bouton Droit JustReleased");
            ctrl.stopRobot(arg0.getWiimoteId());
        }
    }

    public void onIrEvent(IREvent arg0) {
    }

    public void onMotionSensingEvent(MotionSensingEvent arg0) {
    }

    /**
     * Acquisition des données du Nunchuk
     */
    public void onExpansionEvent(ExpansionEvent arg0) {
        if (arg0 instanceof NunchukEvent) {

            NunchukEvent nunchuk = (NunchukEvent) arg0;
            NunchukButtonsEvent buttons = nunchuk.getButtonsEvent();
            JoystickEvent joystick = nunchuk.getNunchukJoystickEvent();

            if (buttons.isButtonCJustPressed()) {
                //afficherMessage("Bouton C justPressed");
            }
            if (buttons.isButtonCJustReleased()) {
                //afficherMessage("Bouton C justReleased");
            }
            if (buttons.isButtonZJustPressed()) {
                //afficherMessage("Bouton Z justPressed");
            }
            if (buttons.isButtonZJustReleased()) {
                //afficherMessage("Bouton Z justReleased");
            }

            float angle = joystick.getAngle();

            // joystick - haut
            if( (angle > 337.5 && angle <= 360) || (angle >0 && angle < 22.5)){
                if(!enMvtAvancer){

                    enMvtTournerGauche = false;
                    enMvtReculer = false;
                    enMvtTournerDroite = false;

                    enMvtDiagonaleHauteDroite = false;
                    enMvtDiagonaleHauteGauche = false;
                    enMvtDiagonaleBasDroite = false;
                    enMvtDiagonaleBasGauche = false;

                    ctrl.avancer(arg0.getWiimoteId());

                    enMvt = true;
                    enMvtAvancer = true;
                }
            }
            // joystick - diagonale haut droite
            else if (angle > 22.5 && angle < 67.5){
                if(!enMvtDiagonaleHauteDroite){

                    enMvtAvancer = false;
                    enMvtTournerGauche = false;
                    enMvtReculer = false;
                    enMvtTournerDroite = false;

                    enMvtDiagonaleHauteGauche = false;
                    enMvtDiagonaleBasDroite = false;
                    enMvtDiagonaleBasGauche = false;

                    ctrl.avancerEtDroite(arg0.getWiimoteId());
                    
                    enMvtDiagonaleHauteDroite = true;
                    enMvt = true;
                }
            }
            // joystick - droite
            else if (angle > 67.5 && angle < 112.5){
                if(!enMvtTournerDroite){

                    enMvtAvancer = false;
                    enMvtReculer = false;
                    enMvtTournerGauche = false;

                    enMvtDiagonaleHauteDroite = false;
                    enMvtDiagonaleHauteGauche = false;
                    enMvtDiagonaleBasDroite = false;
                    enMvtDiagonaleBasGauche = false;

                    ctrl.tournerDroite(arg0.getWiimoteId());
                    
                    enMvtTournerDroite = true;
                    enMvt = true;
                }
            }// joystick - diagonale bas droite
            else if (angle > 112.5 && angle < 157.5){
                if(!enMvtDiagonaleBasDroite){

                    enMvtAvancer = false;
                    enMvtTournerGauche = false;
                    enMvtReculer = false;
                    enMvtTournerDroite = false;

                    enMvtDiagonaleHauteGauche = false;
                    enMvtDiagonaleHauteDroite = false;
                    enMvtDiagonaleBasGauche = false;

                    ctrl.reculerEtDroite(arg0.getWiimoteId());

                    enMvtDiagonaleBasDroite = true;
                    enMvt = true;
                }
            }
            // joystick - bas
            else if (angle > 157.5 && angle < 202.5){
                if(!enMvtReculer){

                    enMvtAvancer = false;
                    enMvtTournerGauche = false;
                    enMvtTournerDroite = false;

                    enMvtDiagonaleHauteDroite = false;
                    enMvtDiagonaleHauteGauche = false;
                    enMvtDiagonaleBasDroite = false;
                    enMvtDiagonaleBasGauche = false;

                    ctrl.reculer(arg0.getWiimoteId());

                    enMvtReculer = true;
                    enMvt = true;
                }
            }
            // joystick - diagonale bas gauche
            else if (angle > 202.5 && angle < 247.5){
                if(!enMvtDiagonaleBasGauche){

                    enMvtAvancer = false;
                    enMvtTournerGauche = false;
                    enMvtReculer = false;
                    enMvtTournerDroite = false;

                    enMvtDiagonaleHauteGauche = false;
                    enMvtDiagonaleBasDroite = false;
                    enMvtDiagonaleHauteDroite = false;

                    ctrl.reculerEtGauche(arg0.getWiimoteId());

                    enMvtDiagonaleBasGauche = true;
                    enMvt = true;
                }
            }
            // joystick - gauche
            else if (angle > 247.5 && angle < 292.5){
                if(!enMvtTournerGauche){

                    enMvtAvancer = false;
                    enMvtReculer = false;
                    enMvtTournerDroite = false;

                    enMvtDiagonaleHauteDroite = false;
                    enMvtDiagonaleHauteGauche = false;
                    enMvtDiagonaleBasDroite = false;
                    enMvtDiagonaleBasGauche = false;

                    ctrl.tournerGauche(arg0.getWiimoteId());

                    enMvtTournerGauche = true;
                    enMvt = true;
                }
            }
            // joystick - diagonal haut gauche
            else if (angle > 292.5 && angle < 337.5){
                if(!enMvtDiagonaleHauteGauche){

                    enMvtAvancer = false;
                    enMvtReculer = false;
                    enMvtTournerDroite = false;
                    enMvtTournerGauche = false;

                    enMvtDiagonaleHauteDroite = false;
                    enMvtDiagonaleBasDroite = false;
                    enMvtDiagonaleBasGauche = false;

                    ctrl.avancerEtGauche(arg0.getWiimoteId());
                    enMvtDiagonaleHauteGauche = true;
                    enMvt = true;
                }
            }
            else{
                if (enMvt){

                    enMvtAvancer = false;
                    enMvtReculer = false;
                    enMvtTournerDroite = false;
                    enMvtTournerGauche = false;

                    enMvtDiagonaleHauteDroite = false;
                    enMvtDiagonaleHauteGauche = false;
                    enMvtDiagonaleBasDroite = false;
                    enMvtDiagonaleBasGauche = false;

                    ctrl.stopRobot(arg0.getWiimoteId());
                    enMvt = false;
                }
            }
        }
    }

    public void onStatusEvent(StatusEvent arg0) {
    }

    /**
     * Deconnexion de la wiimote
     * @param arg0 l'evenement genere par la deconnexion d'une Wiimote.
     */
    public void onDisconnectionEvent(DisconnectionEvent arg0) {
        afficherMessage("Deconnexion detectee");
    }

    /**
     * Insertion du Nunchuk
     * @param arg0 l'evenement genere lors de l'insertion d'un Nunchuk
     */
    public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) {
        afficherMessage("Nunchuk inséré");
    }

    /**
     * Deconnexion du Nunchuk
     * @param arg0
     */
    public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) {
        afficherMessage("Nunchuk debranché");
    }

    public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent ghie) {
    }

    public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent ghre) {
    }

    public void onClassicControllerInsertedEvent(ClassicControllerInsertedEvent ccie) {
    }

    public void onClassicControllerRemovedEvent(ClassicControllerRemovedEvent ccre) {
    }
}
